package xin.mydreams.mybill.global.result;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

import lombok.extern.slf4j.Slf4j;
import xin.mydreams.mybill.global.result.exception.MyException;
import xin.mydreams.mybill.global.result.exception.NoLoginException;
import xin.mydreams.mybill.util.CodeUtil;
import xin.mydreams.mybill.util.ObjectUtil;

/**
 * 统一结果返回
 * 
 * @author
 * @since 谷泽昊 2018年7月18日
 */
@Aspect
@Configuration
@Slf4j
public class FormatResultHandler {

	/**
	 * 拦截formatResult注解
	 * 
	 * @author
	 * @since 谷泽昊 2018年8月21日
	 * @param pjp
	 * @param formatResult
	 * @return
	 */
	@Around("@annotation(formatResult)")
	public Result doAround(ProceedingJoinPoint pjp, FormatResult formatResult) {
		return doAround(pjp);
	}

	/**
	 * 拦截getFormatResult注解
	 * 
	 * @author
	 * @since 谷泽昊 2018年8月21日
	 * @param pjp
	 * @param getFormatResult
	 * @return
	 */
	@Around("@annotation(getFormatResult)")
	public Result doAround(ProceedingJoinPoint pjp, GetFormatResult getFormatResult) {
		return doAround(pjp);
	}

	/**
	 * 拦截postFormatResult注解
	 * 
	 * @author
	 * @since 谷泽昊 2018年8月21日
	 * @param pjp
	 * @param postFormatResult
	 * @return
	 */
	@Around("@annotation(postFormatResult)")
	public Result doAround(ProceedingJoinPoint pjp, PostFormatResult postFormatResult) {
		return doAround(pjp);
	}

	/**
	 * 统一拦截
	 * @author 
	 * @since 谷泽昊 2018年8月21日
	 * @param pjp
	 * @return
	 */
	private Result doAround(ProceedingJoinPoint pjp) {
		try {
			Object proceed = pjp.proceed();
			if(ObjectUtil.isEmpty(proceed)){
				return Result.getResult(CodeUtil.NOT_CONTENT, "成功！", proceed);
			}
			return Result.getResult(CodeUtil.SUCCESS, "成功！", proceed);
		} catch (Throwable e) {
			//
			if (e instanceof NoLoginException) {
				return Result.getResult(CodeUtil.NO_LOGIN, e.getMessage(), e.getMessage());
			}
			if (e instanceof MyException) {
				return Result.getResult(((MyException) e).getCode(), e.getMessage(), e.getMessage());
			}
			log.error("服务器错误：", e);
			return Result.getResult(CodeUtil.OPERATION_EXCEPTION, "失败！", e.getMessage());
		}

	}

}
